home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Programming Languages Suite
/
ProgramD2.iso
/
T U R B O Language
/
Turbo C v2.0
/
SETENVP.ASM
< prev
next >
Wrap
Assembly Source File
|
1988-08-29
|
2KB
|
118 lines
NAME SETENVP
PAGE 60,132
;[]------------------------------------------------------------[]
;| SETENVP.ASM -- Prepare Environment |
;| |
;| Turbo-C Run Time Library version 2.0 |
;| |
;| Copyright (c) 1988 by Borland International Inc. |
;| All Rights Reserved. |
;[]------------------------------------------------------------[]
INCLUDE RULES.ASI
; Segment and Group declarations
Header@
; External references
ExtProc@ malloc, __CDECL__
ExtProc@ abort, __CDECL__
ExtSym@ _envseg, WORD, __CDECL__
ExtSym@ _envLng, WORD, __CDECL__
ExtSym@ _envSize, WORD, __CDECL__
dPtrExt@ environ, __CDECL__
SUBTTL Prepare Environment
PAGE
;/* */
;/*-----------------------------------------------------*/
;/* */
;/* Prepare Environment */
;/* ------------------- */
;/* */
;/*-----------------------------------------------------*/
;/* */
CSeg@
PubProc@ _setenvp, __CDECL__
; Allocate a buffer to hold environment variables
IF LDATA EQ 0
mov cx, _envLng@
push cx
call malloc@
pop cx
mov di, ax
or ax, ax
jz _Failed ; Memory allocation failed
push ds
push ds
pop es
mov ds, _envseg@
xor si, si
cld
rep movsb
pop ds
mov di, ax
ELSE
mov es, _envseg@
xor di, di
ENDIF
; Allocate a buffer to hold envp array
push es ; Save Environment Segment address
push _envSize@
call malloc@
add sp, 2
mov bx, ax
pop es ; Restore Environment Segment address
IF LDATA
mov word ptr environ@, ax
mov word ptr environ@+2, dx
push ds
mov ds, dx
or ax, dx
ELSE
mov word ptr environ@, ax
or ax, ax
ENDIF
jnz SetEnviron ; Memory allocation failed
_Failed label near ; Memory allocation failed
jmp abort@
; Now, store environment variables address
SetEnviron label near
xor ax, ax
mov cx, -1
SetEnviron0 label near
mov [bx], di
IF LDATA
mov [bx+2], es
add bx, 4
ELSE
add bx, 2
ENDIF
repnz scasb
cmp es:[di], al
jne SetEnviron0 ; Set next pointer
IF LDATA
mov [bx], ax
mov [bx+2], ax
pop ds
ELSE
mov [bx], ax
ENDIF
ret
EndProc@ _setenvp, __CDECL__
CsegEnd@
END